/* 
Copyright Paul James Mutton, 2001-2007, http://www.jibble.org/

This file is part of PircBot.

This software is dual-licensed, allowing you to choose between the GNU
General Public License (GPL) and the www.jibble.org Commercial License.
Since the GPL may be too restrictive for use in a proprietary application,
a commercial license is also provided. Full license information can be
found at http://www.jibble.org/licenses/

 */

package org.jibble.pircbot;

/**
 * The Colors class provides several static fields and methods that you may find useful when writing an IRC Bot.
 * <p>
 * This class contains constants that are useful for formatting lines sent to IRC servers. These constants allow you to apply
 * various formatting to the lines, such as colours, boldness, underlining and reverse text.
 * <p>
 * The class contains static methods to remove colours and formatting from lines of IRC text.
 * <p>
 * Here are some examples of how to use the contants from within a class that extends PircBot and imports org.jibble.pircbot.*;
 * 
 * <pre>
 * sendMessage("#cs", Colors.BOLD + "A bold hello!");
 *     <b>A bold hello!</b>
 * sendMessage("#cs", Colors.RED + "Red" + Colors.NORMAL + " text");
 *     <font color="red">Red</font> text
 * sendMessage("#cs", Colors.BOLD + Colors.RED + "Bold and red");
 *     <b><font color="red">Bold and red</font></b>
 * </pre>
 * 
 * Please note that some IRC channels may be configured to reject any messages that use colours. Also note that older IRC clients
 * may be unable to correctly display lines that contain colours and other control characters.
 * <p>
 * Note that this class name has been spelt in the American style in order to remain consistent with the rest of the Java API.
 * 
 * 
 * @since 0.9.12
 * @author Paul James Mutton, <a href="http://www.jibble.org/">http://www.jibble.org/</a>
 * @version 1.4.6 (Build time: Wed Apr 11 19:20:59 2007)
 */
public final class Colors {

   /**
    * Removes all previously applied color and formatting attributes.
    */
   public static final String NORMAL = "\u000f";

   /**
    * Bold text.
    */
   public static final String BOLD = "\u0002";

   /**
    * Underlined text.
    */
   public static final String UNDERLINE = "\u001f";

   /**
    * Reversed text (may be rendered as italic text in some clients).
    */
   public static final String REVERSE = "\u0016";

   /**
    * White coloured text.
    */
   public static final String WHITE = "\u000300";

   /**
    * Black coloured text.
    */
   public static final String BLACK = "\u000301";

   /**
    * Dark blue coloured text.
    */
   public static final String DARK_BLUE = "\u000302";

   /**
    * Dark green coloured text.
    */
   public static final String DARK_GREEN = "\u000303";

   /**
    * Red coloured text.
    */
   public static final String RED = "\u000304";

   /**
    * Brown coloured text.
    */
   public static final String BROWN = "\u000305";

   /**
    * Purple coloured text.
    */
   public static final String PURPLE = "\u000306";

   /**
    * Olive coloured text.
    */
   public static final String OLIVE = "\u000307";

   /**
    * Yellow coloured text.
    */
   public static final String YELLOW = "\u000308";

   /**
    * Green coloured text.
    */
   public static final String GREEN = "\u000309";

   /**
    * Teal coloured text.
    */
   public static final String TEAL = "\u000310";

   /**
    * Cyan coloured text.
    */
   public static final String CYAN = "\u000311";

   /**
    * Blue coloured text.
    */
   public static final String BLUE = "\u000312";

   /**
    * Magenta coloured text.
    */
   public static final String MAGENTA = "\u000313";

   /**
    * Dark gray coloured text.
    */
   public static final String DARK_GRAY = "\u000314";

   /**
    * Light gray coloured text.
    */
   public static final String LIGHT_GRAY = "\u000315";

   /**
    * Removes all colours from a line of IRC text.
    * 
    * @since PircBot 1.2.0
    * 
    * @param line
    *           the input text.
    * 
    * @return the same text, but with all colours removed.
    */
   public static String removeColors(final String line) {
	  int length = line.length();
	  StringBuffer buffer = new StringBuffer();
	  int i = 0;
	  while (i < length) {
		 char ch = line.charAt(i);
		 if (ch == '\u0003') {
			i++;
			// Skip "x" or "xy" (foreground color).
			if (i < length) {
			   ch = line.charAt(i);
			   if (Character.isDigit(ch)) {
				  i++;
				  if (i < length) {
					 ch = line.charAt(i);
					 if (Character.isDigit(ch)) {
						i++;
					 }
				  }
				  // Now skip ",x" or ",xy" (background color).
				  if (i < length) {
					 ch = line.charAt(i);
					 if (ch == ',') {
						i++;
						if (i < length) {
						   ch = line.charAt(i);
						   if (Character.isDigit(ch)) {
							  i++;
							  if (i < length) {
								 ch = line.charAt(i);
								 if (Character.isDigit(ch)) {
									i++;
								 }
							  }
						   } else {
							  // Keep the comma.
							  i--;
						   }
						} else {
						   // Keep the comma.
						   i--;
						}
					 }
				  }
			   }
			}
		 } else if (ch == '\u000f') {
			i++;
		 } else {
			buffer.append(ch);
			i++;
		 }
	  }
	  return buffer.toString();
   }

   /**
    * Remove formatting from a line of IRC text.
    * 
    * @since PircBot 1.2.0
    * 
    * @param line
    *           the input text.
    * 
    * @return the same text, but without any bold, underlining, reverse, etc.
    */
   public static String removeFormatting(final String line) {
	  int length = line.length();
	  StringBuffer buffer = new StringBuffer();
	  for (int i = 0; i < length; i++) {
		 char ch = line.charAt(i);
		 if (ch == '\u000f' || ch == '\u0002' || ch == '\u001f' || ch == '\u0016') {
			// Don't add this character.
		 } else {
			buffer.append(ch);
		 }
	  }
	  return buffer.toString();
   }

   /**
    * Removes all formatting and colours from a line of IRC text.
    * 
    * @since PircBot 1.2.0
    * 
    * @param line
    *           the input text.
    * 
    * @return the same text, but without formatting and colour characters.
    * 
    */
   public static String removeFormattingAndColors(final String line) {
	  return removeFormatting(removeColors(line));
   }

   /**
    * This class should not be constructed.
    */
   private Colors() {

   }

}
